<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="zIGLQ" id="zIGLQ"><span data-lake-id="u22eccb36" id="u22eccb36">典型回答</span></h1>
  <p data-lake-id="u9160702c" id="u9160702c"><br></p>
  <p data-lake-id="u2929cae5" id="u2929cae5"><span data-lake-id="u072b6189" id="u072b6189">在Spring的BeanFactory体系中，BeanFactory是Spring IoC容器的基础接口，其DefaultSingletonBeanRegistry类实现了BeanFactory接口，并且维护了三级缓存：</span></p>
  <p data-lake-id="u21b700e8" id="u21b700e8"><span data-lake-id="ue7b190ed" id="ue7b190ed">​</span><br></p>
  <pre lang="java"><code>
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
  //一级缓存，保存完成的Bean对象
  private final Map&lt;String, Object&gt; singletonObjects = new ConcurrentHashMap&lt;&gt;(256);
  //三级缓存，保存单例Bean的创建工厂
  private final Map&lt;String, ObjectFactory&lt;?&gt;&gt; singletonFactories = new HashMap&lt;&gt;(16);
  //二级缓存，存储"半成品"的Bean对象
  private final Map&lt;String, Object&gt; earlySingletonObjects = new ConcurrentHashMap&lt;&gt;(16);
}
</code></pre>
  <p data-lake-id="uc7d15b7d" id="uc7d15b7d"><br></p>
  <p data-lake-id="u491a19bb" id="u491a19bb"><strong><span data-lake-id="u18f65dfd" id="u18f65dfd">singletonObjects是一级缓存，存储的是完整创建好的单例bean对象。</span></strong><span data-lake-id="u2f2742d5" id="u2f2742d5">在创建一个单例bean时，会先从singletonObjects中尝试获取该bean的实例，如果能够获取到，则直接返回该实例，否则继续创建该bean。</span></p>
  <p data-lake-id="u6e71ca63" id="u6e71ca63"><span data-lake-id="u5f2ff2bb" id="u5f2ff2bb">​</span><br></p>
  <p data-lake-id="u6e13016f" id="u6e13016f"><strong><span data-lake-id="u040d2e9f" id="u040d2e9f">earlySingletonObjects是二级缓存，存储的是尚未完全创建好的单例bean对象。</span></strong><span data-lake-id="uaef237ad" id="uaef237ad">在创建单例bean时，如果发现该bean存在循环依赖，则会先创建该bean的"半成品"对象，并将"半成品"对象存储到earlySingletonObjects中。当循环依赖的bean创建完成后，Spring会将完整的bean实例对象存储到singletonObjects中，并将earlySingletonObjects中存储的代理对象替换为完整的bean实例对象。这样可以保证单例bean的创建过程不会出现循环依赖问题。</span></p>
  <p data-lake-id="uf88b9b88" id="uf88b9b88"><br></p>
  <p data-lake-id="u3102bd32" id="u3102bd32"><strong><span data-lake-id="uc0969fd8" id="uc0969fd8">singletonFactories是三级缓存，存储的是单例bean的创建工厂。</span></strong><span data-lake-id="u17df0430" id="u17df0430">当一个单例bean被创建时，Spring会先将该bean的创建工厂存储到singletonFactories中，然后再执行创建工厂的getObject()方法，生成该bean的实例对象。在该bean被其他bean引用时，Spring会从singletonFactories中获取该bean的创建工厂，创建出该bean的实例对象，并将该bean的实例对象存储到singletonObjects中。</span></p>
  <p data-lake-id="u028ccacd" id="u028ccacd"><span data-lake-id="u75b974b9" id="u75b974b9">​</span><br></p>
  <p data-lake-id="uf6b92c80" id="uf6b92c80"><span data-lake-id="u2fe1522c" id="u2fe1522c">​</span><br></p>
  <h1 data-lake-id="RqabE" id="RqabE"><span data-lake-id="uc6a2842f" id="uc6a2842f">扩展知识</span></h1>
  <p data-lake-id="uf1a892e1" id="uf1a892e1"><br></p>
  <h2 data-lake-id="S0hJ4" id="S0hJ4"><span data-lake-id="u5b47b766" id="u5b47b766">三级缓存与循环依赖</span></h2>
  <p data-lake-id="u6606cd7a" id="u6606cd7a"><br></p>
 </body>
</html>